home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 076-100 / disk_077 / rawsamples / detab.d next >
Text File  |  1992-05-06  |  4KB  |  183 lines

  1. type FileHandle_t = ulong;
  2.  
  3. ulong
  4.     MODE_OLDFILE = 1005,
  5.     MODE_NEWFILE = 1006;
  6.  
  7. uint BUFFER_SIZE = 10000;
  8. uint NAME_SIZE = 100;
  9.  
  10. extern
  11.     OpenDosLibrary(ulong version)*byte,
  12.     CloseDosLibrary()void,
  13.     Rename(*char oldName, newName)ulong,
  14.     Open(*char fileName; ulong mode)FileHandle_t,
  15.     Close(FileHandle_t fd)void,
  16.     Read(FileHandle_t fd; *char buffer; ulong length)ulong,
  17.     Write(FileHandle_t fd; *char buffer; ulong length)ulong,
  18.     Exit(ulong status)void,
  19.     Output()FileHandle_t,
  20.     GetPars(*ulong pLen; **char pPtr)void;
  21.  
  22. [BUFFER_SIZE] char InputBuffer, OutputBuffer;
  23. uint InputPos, InputMax, OutputPos;
  24. bool Eof;
  25. FileHandle_t StdOut, InputFd, OutputFd;
  26.  
  27. proc print(*char message)void:
  28.    *char p;
  29.  
  30.     p := message;
  31.     while p* ~= '\e' do
  32.     p := p + 1;
  33.     od;
  34.     if Write(StdOut, message, p - message) ~= p - message then
  35.     Exit(40);
  36.     fi;
  37. corp;
  38.  
  39. proc getChar()char:
  40.  
  41.     if InputPos = InputMax then
  42.     InputPos := 0;
  43.     InputMax := Read(InputFd, &InputBuffer[0], BUFFER_SIZE);
  44.     if InputMax = 0 then
  45.         Eof := true;
  46.     fi;
  47.     fi;
  48.     InputPos := InputPos + 1;
  49.     InputBuffer[InputPos - 1]
  50. corp;
  51.  
  52. proc flushOutput()void:
  53.  
  54.    if Write(OutputFd, &OutputBuffer[0], OutputPos) ~= OutputPos then
  55.       print("detab: bad write to output file - aborting.\n");
  56.       Close(OutputFd);
  57.       Close(InputFd);
  58.       Exit(30);
  59.    fi;
  60. corp;
  61.  
  62. proc putChar(char ch)void:
  63.  
  64.     if OutputPos = BUFFER_SIZE then
  65.     flushOutput();
  66.     OutputPos := 0;
  67.     fi;
  68.     OutputBuffer[OutputPos] := ch;
  69.     OutputPos := OutputPos + 1;
  70. corp;
  71.  
  72. proc detab()void:
  73.     char ch;
  74.     uint column;
  75.     char CPM_EOF = '\(0x1a)';
  76.  
  77.     Eof := false;
  78.     column := 0;
  79.     while
  80.     ch := getChar();
  81.     not Eof and ch ~= CPM_EOF
  82.     do
  83.     if ch = '\t' then
  84.         while
  85.         putChar(' ');
  86.         column := column + 1;
  87.         column & 7 ~= 0
  88.         do
  89.         od;
  90.     elif ch = '\n' then
  91.         putChar('\n');
  92.         column := 0;
  93.     elif ch ~= '\r' then
  94.         putChar(ch);
  95.         column := column + 1;
  96.     fi;
  97.     od;
  98. corp;
  99.  
  100. proc process(*char fileName)void:
  101.     *char p, q;
  102.     [NAME_SIZE] char nameBuffer;
  103.  
  104.     p := &nameBuffer[0];
  105.     q := fileName;
  106.     while
  107.     p* := q*;
  108.     p* ~= '\e'
  109.     do
  110.     p := p + 1;
  111.     q := q + 1;
  112.     od;
  113.     (p + 0)* := '.';
  114.     (p + 1)* := 'B';
  115.     (p + 2)* := 'A';
  116.     (p + 3)* := 'K';
  117.     (p + 4)* := '\e';
  118.     if Rename(fileName, &nameBuffer[0]) = 0 then
  119.     print("Can't rename file to .BAK - aborting\n");
  120.     Exit(30);
  121.     fi;
  122.     InputFd := Open(&nameBuffer[0], MODE_OLDFILE);
  123.     if InputFd = 0 then
  124.     print("Can't open old file for input - aborting\n");
  125.     Exit(20);
  126.     fi;
  127.     OutputFd := Open(fileName, MODE_NEWFILE);
  128.     if OutputFd = 0 then
  129.     print("Can't open new file for output - aborting\n");
  130.     Close(InputFd);
  131.     Exit(30);
  132.     fi;
  133.     InputPos := 0;
  134.     InputMax := 0;
  135.     OutputPos := 0;
  136.     detab();
  137.     if OutputPos ~= 0 then
  138.     flushOutput();
  139.     fi;
  140.     Close(InputFd);
  141.     Close(OutputFd);
  142. corp;
  143.  
  144. proc main()void:
  145.     *char parPtr;
  146.     ulong parLen;
  147.     *char nameStart;
  148.     bool doneFile;
  149.  
  150.     if OpenDosLibrary(0) ~= nil then
  151.     GetPars(&parLen, &parPtr);
  152.     StdOut := Output();
  153.     doneFile := false;
  154.     while
  155.         while parLen ~= 0 and
  156.             (parPtr* = ' ' or parPtr* = '\n' or parPtr* = '\r') do
  157.         parLen := parLen - 1;
  158.         parPtr := parPtr + 1;
  159.         od;
  160.         parLen ~= 0
  161.     do
  162.         doneFile := true;
  163.         nameStart := parPtr;
  164.         while parLen ~= 0 and
  165.             parPtr* ~= ' ' and parPtr* ~= '\n' and parPtr* ~= '\r' do
  166.         parLen := parLen - 1;
  167.         parPtr := parPtr + 1;
  168.         od;
  169.         parPtr* := '\e';
  170.         parLen := parLen - 1;
  171.         parPtr := parPtr + 1;
  172.         print(nameStart);
  173.         print(":\n");
  174.         process(nameStart);
  175.     od;
  176.     if not doneFile then
  177.         print("Use is: detab file ... file\n");
  178.         Exit(10);
  179.     fi;
  180.     CloseDosLibrary();
  181.     fi;
  182. corp;
  183.